package com.demo.controller;

import com.demo.common.BaseRes;
import com.demo.pojo.SsopDictValue;
import com.demo.service.SsopDictValueService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.*;

/**
 * 省市区 树形结构数据  递归
 */
@RestController
@RequestMapping("/region")
public class SsopDictValueController {


    @Resource
    private SsopDictValueService ssopDictValueService;

    @GetMapping("/list")
    @ResponseBody
    public BaseRes list() {
        BaseRes res = new BaseRes();
        List<SsopDictValue> list = ssopDictValueService.getList();// 根据步骤三查到的集合(region表的全部数据)
        List<SsopDictValue> tree = buildAreaTree(list);   // 组装一个菜单树
        res.setSuccess("树形式数据", tree);
        return res;
    }


    public List<SsopDictValue> buildAreaTree(List<SsopDictValue> regions) {
        List<SsopDictValue> tree = new ArrayList<>();
        for (Iterator<SsopDictValue> it = regions.iterator(); it.hasNext(); ) {
            SsopDictValue region = (SsopDictValue) it.next();
            if (region.getParentId() == 0) {
                recursionFn(regions, region);  //递归列表
                tree.add(region);
            }
        }
        return tree;
    }

    /**
     * 递归列表
     *
     * @param list
     * @param region
     */
    private void recursionFn(List<SsopDictValue> list, SsopDictValue region) {
        // 得到子节点列表
        List<SsopDictValue> childList = getChildList(list, region);
        region.setChildren(childList);
        for (SsopDictValue child : childList) {
            if (hasChild(list, child)) {
                //判断是否有子节点
                Iterator<SsopDictValue> it = childList.iterator();
                while (it.hasNext()) {
                    SsopDictValue n = (SsopDictValue) it.next();
                    recursionFn(list, n);
                }
            }
        }
    }

    /**
     * 得到子节点列表
     *
     * @param list
     * @param region
     * @return
     */
    private List<SsopDictValue> getChildList(List<SsopDictValue> list, SsopDictValue region) {
        List<SsopDictValue> tlist = new ArrayList<SsopDictValue>();
        Iterator<SsopDictValue> it = list.iterator();
        while (it.hasNext()) {
            SsopDictValue region1 = (SsopDictValue) it.next();
            if (region1.getParentId().longValue() == region.getId().longValue()) {
                tlist.add(region1);
            }
        }
        return tlist;
    }

    /**
     * 判断是否有子节点
     *
     * @param list
     * @param region
     * @return
     */
    private boolean hasChild(List<SsopDictValue> list, SsopDictValue region) {
        return getChildList(list, region).size() > 0 ? true : false;
    }


    @RequestMapping("getTree")
    public Map<String, Object> getTree() {
        Map<String, Object> map = new HashMap<>();
         try {
            List<SsopDictValue> list = ssopDictValueService.getList();// 根据步骤三查到的集合(region表的全部数据)
            for (SsopDictValue ssopDictValue : list) {
                 if (ssopDictValue.getParentId() == 0) {
                    List<SsopDictValue> citys = ssopDictValueService.findChildren(ssopDictValue.getId());//查询省下面的所有市
                    digui(citys); //调用递归算法查询市以下的区县
                    ssopDictValue.setChildren(citys);
                }
            }
            map.put("data", list);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return map;
    }

    public void digui(List<SsopDictValue> citys) {
        List<SsopDictValue> retList = new ArrayList<>();
        for (SsopDictValue c : citys) {
            retList = ssopDictValueService.findChildren(c.getId());
            if (retList.size() > 0) {
                c.setChildren(retList);
                digui(retList); //循环调用自己
            }
        }
    }


}

